package com.nexus.plugin.tenant;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * MyBatis-Plus配置类，注册租户插件
 *
 * @Date 2025/7/25 11:10
 * @Author luzhengning
 **/
@Configuration
public class MyBatisTenantConfig {

    /**
     * 注册租户插件，实现SQL自动拼接tenant_id条件
     * @Date 2025/7/25 11:39
     * @Author luzhengning
     **/
    @Bean
    public MybatisPlusInterceptor mybatisTenantInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        // 添加租户拦截器
        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
            /**
             * 获取当前租户ID（与TenantContextHolder关联）
             */
            @Override
            public Expression getTenantId() {
                Long tenantId = TenantContextHolder.getTenantId();
                // 租户ID为空时的处理（如抛异常或返回默认值）
                if (tenantId == null) {
                    throw new RuntimeException("Tenant ID is null");
                }
                return new LongValue(tenantId);
            }

            /**
             * 指定租户字段名（需与实体类中的tenantId字段对应）
             */
            @Override
            public String getTenantIdColumn() {
                return "tenant_id";
            }

            /**
             * 忽略租户过滤的表（如公共字典表、系统配置表等）
             */
            @Override
            public boolean ignoreTable(String tableName) {
                // 示例：忽略租户表本身（避免查询租户信息时被过滤）
                return "sys_tenant".equals(tableName);
            }
        }));

        return interceptor;
    }
}
